
package com.eva.android.shortvideo;

import android.content.Context;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.view.ViewGroup;
import android.widget.Button;

import com.eva.android.widget.DataLoadableActivity;
import com.eva.android.HttpFileDownloadHelper;
import com.eva.android.IntentFactory;
import com.eva.framework.dto.DataFromServer;
import com.x52im.rbchat.R;
import com.x52im.rbchat.logic.qrcode.utils.StatusBarUtils;

import java.util.ArrayList;

/**
 * 短视频播放实现类。
 *
 * @author Jack Jiang
 * @since 4.4
 */
public class ShortVideoPlayerActivity extends DataLoadableActivity
{
    private final static String TAG = ShortVideoPlayerActivity.class.getSimpleName();

    /** 视频来源 */
    protected int mVideoDataType = VideoDataType.FILE_PATH;
    /**
     * 视频数据源地址：
     * <p>
     * 1）当来自VideoDataType.FILE_PATH时，开发者传入的本字段值为视频文件的本地绝对路径；
     * 2）当来自VideoDataType.FILE_URL时，开发者传入的本字段值为视频文件的网络下载URL。
     */
    protected String mVideoDataSrc = null;
    /** 下载的视频的保存目录（如果mVideoDataType == VideoDataType.URL时本字段才有意义）*/
    protected String mSavedDir = null;

    // 本字段保存的是视频的文件本地绝对路径（当视频文件来自网络时，本字段将在文件下载成功完成后被设置，否则初始化时就会被设置）
    protected String mVideoFileSavedPath = null;

    // 视频播放器封装类
    private VideoPlayWrapper videoPlayWrapper = null;
    // 视频显示相关组件
    protected ViewGroup layoutVideoView = null;
    // 当没有视频或视频载入时的ui显示包装类
    protected NoVideoWrapper noVideoWrapper = null;

    // 关闭界面按钮
    protected Button btnClose = null;

    /**
     * 重写finish方法，实现时关闭界面时能进行相应的资源释放。
     */
    @Override
    public void finish()
    {
        videoPlayWrapper.stop();
        super.finish();
    }

//    @Override
//    protected void onDestroy()
//    {
//        videoPlayWrapper.stop();
//        super.onDestroy();
//    }

    /**
     * {@inheritDoc}
     */
    @Override
    protected void initDataFromIntent()
    {
        //解析从intent中传过来的数据
        ArrayList intentDatas = IntentFactory.parseShortVideoPlayerActivityIntent(getIntent());
        mVideoDataType = (Integer)intentDatas.get(0);
        mVideoDataSrc = (String)intentDatas.get(1);
        mSavedDir = (String)intentDatas.get(2);
    }

    @Override
    protected void initViews(Bundle savedInstanceState)
    {
        // 养成良好习惯：首先设置主layout，确保后绪的操作中使用到的组件都可以被find到
        setContentView(R.layout.common_short_video_player_activity);
        // 对界面上方进行全面屏设置
        StatusBarUtils.immersiveStatusBar(this, findViewById(R.id.toolbar),0.0f);

        layoutVideoView = (ViewGroup)findViewById(R.id.common_short_video_player_ac_viewVideoFL);
        btnClose = (Button)findViewById(R.id.common_short_video_player_ac_closeBtn);

        videoPlayWrapper = new VideoPlayWrapper(this)//, mVideoDataSrc)
        {
            @Override
            protected void playComplete(boolean withError)
            {
                super.playComplete(withError);

                if(withError)
                {
                    shitHintForException("视频播放出错，请稍后再试！");
                }
                else
                {
                    // 在此可以实现视频播放完成后该做的事。。
                }
            }
        };

        noVideoWrapper = new NoVideoWrapper(this);
    }

    @Override
    protected void initListeners()
    {
        btnClose.setOnClickListener(new View.OnClickListener()
        {
            @Override
            public void onClick(View view)
            {
                finish();
            }
        });
    }

    @Override
    protected DataFromServer queryData(String... arg0)
    {
        return null;
    }

    /**
     * 本方法将从指定文件路径加载视频以便显示。
     * 本方法将自动被调用，无需用户动手。
     *
     * @param arg0
     */
    @Override
    protected void refreshToView(Object arg0)
    {
        if(mVideoDataSrc == null)
            shitHintForException("参数错误，无法播放！");

        try
        {
            switch(mVideoDataType)
            {
                case VideoDataType.FILE_PATH:
                {
                    this.mVideoFileSavedPath = this.mVideoDataSrc;
                    playVideoFromFile();//mImageDataSrc);
                    break;
                }
                case VideoDataType.URL:
                {
//                    new HttpFileDownloadHelper.DownloadAsyncRoot(this
//                            , mVideoDataSrc
//                            , mSavedDir)
//                    {
//                        @Override
//                        protected void onPreExecute()
//                        {
//                            Log.d(TAG, "【查看视频界面】马上开始从网络加载视频"+mVideoDataSrc +"。。。。");
//                            noVideoWrapper
//                                    .setVisible(true, true)
//                                    .setIcon(R.drawable.null_pic)
//                                    .setText("视频加载中 ...");
//                        }
//                        @Override
//                        protected void onProgressUpdate(Integer... progress)
//                        {
//                            noVideoWrapper.setProgress(progress[0]);
//                        }
//
//                        @Override
//                        protected void onPostExecute_onSucess(String fileSavedPath)
//                        {
//                            Log.i(TAG, "【查看视频界面】从网络加载视频"+mVideoDataSrc +"成功完成！【OK】");
//
//                            try
//                            {
//                                // 将本次下载保存成后的路径暂存待播放时使用
//                                mVideoFileSavedPath = fileSavedPath;
//                                playVideoFromFile();//fileSavedPath);
//                            }
//                            catch (Exception e)
//                            {
//                                Log.e(TAG, "【查看视频界面】从网络加载视频时失败：videoDataSrc="+mVideoDataSrc
//                                        +", mSavedDir="+mSavedDir+"：", e);
//                                shitHintForException("视频已失效或被移除，载入失败");
//                            }
//                        }
//
//                        @Override
//                        protected void onPostExecute_onException(Exception exception)
//                        {
//                            Log.w(TAG, "【查看视频界面】从网络加载视频"+mVideoDataSrc
//                                    +"发生了异常，原因："+exception.getMessage(), exception);
//                            shitHintForException("视频已失效或被移除，载入失败");
//                        }
//                    }.execute();

                    new VideoDownloadAsyncTask(this, mVideoDataSrc, mSavedDir).execute();
                    break;
                }
            }
        }
        catch(OutOfMemoryError e2)
        {
            Log.e(TAG, e2.getMessage(), e2);
//            mVideoImage.setImageDrawable(null);
            shitHintForException("内存不足，请重启程序后再试。");
        }
        catch (Exception e)
        {
            Log.e(TAG, e.getMessage(), e);
//            mViewImage.setImageDrawable(null);
            shitHintForException("需要打开的视频数据不正确，请关闭后再试！");
        }
    }

    private void playVideoFromFile() throws Exception
    {
        //
        layoutVideoView.setVisibility(View.VISIBLE);
        noVideoWrapper.setVisible(false);

        this.videoPlayWrapper.play(this.mVideoFileSavedPath);
    }

    protected void shitHintForException(String msg)
    {
        noVideoWrapper
                .setVisible(true, false)
                .setIcon(R.drawable.common_short_video_player_error_icon)
                .setText(msg);
    }


    private class VideoDownloadAsyncTask extends HttpFileDownloadHelper.DownloadAsyncRoot
    {
        public VideoDownloadAsyncTask(Context activity, String fileURL, String saveDir)
        {
            super(activity, fileURL, saveDir);
        }

        @Override
        protected void onPreExecute()
        {
            Log.d(TAG, "【查看视频界面】马上开始从网络加载视频"+mVideoDataSrc +"。。。。");
            noVideoWrapper
                    .setVisible(true, true)
                    .setIcon(R.drawable.null_pic)
                    .setText("视频加载中 ...");
        }
        @Override
        protected void onProgressUpdate(Integer... progress)
        {
            noVideoWrapper.setProgress(progress[0]);
        }

        @Override
        protected void onPostExecute_onSucess(String fileSavedPath)
        {
            Log.i(TAG, "【查看视频界面】从网络加载视频"+mVideoDataSrc +"成功完成！【OK】");

            try
            {
                // 将本次下载保存成后的路径暂存待播放时使用
                mVideoFileSavedPath = fileSavedPath;
                playVideoFromFile();//fileSavedPath);
            }
            catch (Exception e)
            {
                Log.e(TAG, "【查看视频界面】从网络加载视频时失败：videoDataSrc="+mVideoDataSrc
                        +", mSavedDir="+mSavedDir+"：", e);
                shitHintForException("视频已失效或被移除，载入失败");
            }
        }

        @Override
        protected void onPostExecute_onException(Exception exception)
        {
            Log.w(TAG, "【查看视频界面】从网络加载视频"+mVideoDataSrc
                    +"发生了异常，原因："+exception.getMessage(), exception);
            shitHintForException("视频已失效或被移除，载入失败");
        }
    }


    /**
     * 视频来源常量接口。
     */
    public interface VideoDataType
    {
        /** 视频文件来自本地文件 */
        int FILE_PATH = 0;
        /** 视频文件来自Http网络 */
        int URL = 2;
    }
}
